// 不建议前端脱敏！
// 手机号脱敏
export const confusePhone = phone => {
  return phone ? phone.replace(/^(.{3})(?:\d+)(.{4})$/, '$1****$2') : phone;
};

// 身份证脱敏
export const confuseIdCard = idCard => {
  return idCard ? idCard.replace(/^(.{1})(?:\d+)(.{1})$/, '$1************$2') : idCard;
};

// 姓名脱敏
export const confuseName = name => {
  return name ? name.replace(/^./, '*') : name;
};

// 其它脱敏
export const confuseOther = info => {
  return info ? `${ info.substring(0, parseInt((info.length/3))) }${ '*'.repeat(parseInt((info.length/3)*2)) }` : info;
};

// 下面的方法自己按需引入

// 千分位
export const toThousands = num => {
  if(num === null || num === undefined) return '';
  return String(num).indexOf('.') > -1
    ? num.toFixed(2).toString().replace(/\d(?=(?:\d{3})+\b)/g, '$&,')
    : num.toString().replace(/\d(?=(?:\d{3})+\b)/g, '$&,');
};

// 获取当前系统时间 || 时间格式化
// value 需要格式化的时间戳 不传就是获取当前系统时间
export const getTime = ( value, format = 'yyyy-MM-dd HH:mm:ss' ) => {
  let date = '';
  value ? (date = new Date(value)): date = new Date();
  let year = date.getFullYear();
  let month = date.getMonth() + 1;
  let day = date.getDate();
  let hour = date.getHours();
  let min = date.getMinutes();
  let sec = date.getSeconds();
  month < 10 && (month = `0${ month }`);
  day < 10 && (day = `0${ day }`);
  hour < 10 && (hour = `0${ hour }`);
  min < 10 && (min = `0${ min }`);
  sec < 10 && (sec = `0${ sec }`);

  return format.replace('yyyy', year).replace('MM', month).replace('dd', day)
    .replace('HH', hour)
    .replace('mm', min)
    .replace('ss', sec);
};

// 字典值文互转 value：要转换成文本的数值或者要转换成数值的文本 arr：对应的字典数组 prop：字典数组中每个对象相应的意思 key||value
export const value2text = (value, arr, prop = { text: 'text', value: 'value' }) => {
  if (!arr || !arr.length) {
    return value;
  }
  let opt = arr.find(item => {
    return item[prop.value] == value;
  });
  return opt ? opt[prop.text] : value;
};

// 手机号校验
export const checkMobile = mobile => {
  return mobile == '' ? false : new RegExp(/^(((1[3456789][0-9]{1})|(15[0-9]{1}))+\d{8})$/).test(mobile);
};

// 身份证校验 旧版身份证15位 新版18位
export const checkIdCard = idCard => {
  if(idCard.length === 18) {
    return new RegExp(/^[1-9]\d{5}(18|19|20|(3\d))\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/).test(idCard);
  } else if(idCard.length === 15) {
    return new RegExp(/^[1-9]\d{5}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}$/).test(idCard);
  } else {
    return false;
  }
};

// 邮箱校验
export function checkEmail(email) {
  return email == '' ? false : new RegExp('^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$').test(email);
}

//非空校验,可判断字符是否为空或对象属性的值是否为空 [] == '' : true , 可用于判断数组是否为空
export const isEmpty = param => {
  if (Object.prototype.toString.call(param) === '[object Object]') {
    return Object.keys(param).some(key => { return param[key] == '' || param[key] == undefined || param[key] == null;});
  } else return param == null || param == undefined || param == '';
};

// 是否为小数
export const isDecimal = str => { return new RegExp(/^\d+\.\d+$/).test(str); };

// 获取用户设备环境
export const getDevice = () => {
  const ua = navigator.userAgent.toLowerCase();
  let app_type = '';
  if (ua.match(/MicroMessenger/i) === 'micromessenger') {
    app_type = 'weixin'; // 微信
  } else if(ua.match(/AlipayClient/i) === 'alipayclient'){
    app_type = 'zfb'; // 支付宝
  } else if(ua.match(/dingtalk/i) === 'dingtalk'){
    app_type = 'dd'; // 钉钉
  } else if(ua.match(/dtdreamweb/i) === 'dtdreamweb'){
    app_type = 'zlb'; // 浙里办
  } else {
    app_type = 'other'; // 其他
  }
  if (ua.match(/iPhone\sOS/i) === 'iphone os' || ua.match(/iPad/i) === 'ipad') {
    return { ua: 'iOS', appType: app_type };
  }
  if (ua.match(/Android/i) === 'android') {
    return { ua: 'Android', appType: app_type };
  }
  if(!(/(iPhone|iPad|iPod|iOS|Android|Linux armv8l|Linux armv7l|Linux aarch64)/i).test(navigator.platform)){
    return { ua: 'PC', appType: app_type };
  }
  return { ua, appType: app_type };
};

// 防抖（不在触发事件了，再调用方法） func: 需要防抖处理的方法，wait: 等待时间， immediate：是否立即执行
export function debounce( func, wait, immediate = false) {
  var timeout;
  return function () {
    var context = this;
    var args = arguments;
    if (timeout) clearTimeout(timeout);
    if (immediate) {
      // 如果已经执行过，不再执行
      var callNow = !timeout;
      timeout = setTimeout(function(){
        func.apply(context, args);
      }, wait);
      if (callNow) func.apply(context, args);
    }
    else {
      timeout = setTimeout(function(){
        func.apply(context, args);
      }, wait);
    }
  };
}

// 节流（每过一段时间调用一次方法）
export function throttle(func, wait) {
  var context, args;
  var previous = 0;
  return function() {
    var now = +new Date();
    context = this;
    args = arguments;
    if (now - previous > wait) {
      func.apply(context, args);
      previous = now;
    }
  };
}

// 返回顶部
export function toTop() {
  if (document.documentElement && document.documentElement.scrollTop) {
    document.documentElement.scrollTop = 0;
  } else {
    document.body.scrollTop = 0;
  }
}

// 数值格式化
// num: 需要格式化的数字，n: 小数点后位数
export const formatNum = (num, n) => {
  if (typeof num == 'number') {
    num = String(num.toFixed(n || 0));
    var re = /(-?\d+)(\d{3})/;
    while (re.test(num)) num = num.replace(re, '$1,$2');
    return num;
  }
  return num;
};

// 判断字段类型
export const getType = value => {
  return Object.prototype.toString.call(value).slice(8, -1);
};

// base64 转Blob
export const dataURLtoBlob = dataurl => {
  let arr = dataurl.split(',');
  let bstr = atob(arr[1]); // base64 解码
  let n = bstr.length;
  let u8arr = new Uint8Array(n);
  while (n--) {
    u8arr[n] = bstr.charCodeAt(n);
  }
  return new Blob([ u8arr ], { type: 'image/png' });
};

// Blob 转flie
export const blobToFile = Blobs => {
  Blobs.lastModifiedDate = new Date(); // 文件最后的修改日期
  Blobs.name = 'sign.png'; // 文件名
  return new File([ Blobs ], 'sign.png', { type: Blobs.type, lastModified: Date.now() });
};

